#include "drv_vbus_sw.h"
#include "menu_handle.h"

void vbus_sw_gpio_init(void)
{
    gpio_init_type gpio_initstruct = {0};
    
    crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
    crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
    gpio_default_para_init(&gpio_initstruct);
    gpio_initstruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_initstruct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_initstruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
    gpio_initstruct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_7 | GPIO_PINS_8 | GPIO_PINS_9;
    gpio_initstruct.gpio_pull = GPIO_PULL_NONE;
    
    VBUS1_OFF();
    VBUS2_OFF();
    VBUS3_OFF();
    VBUS4_OFF();
    
    gpio_init(GPIOA, &gpio_initstruct);
    
    gpio_default_para_init(&gpio_initstruct);
    gpio_initstruct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_initstruct.gpio_mode = GPIO_MODE_INPUT;
    gpio_initstruct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
    gpio_initstruct.gpio_pins = GPIO_PINS_3 | GPIO_PINS_6; // OVC 1 2
    gpio_initstruct.gpio_pull = GPIO_PULL_UP;
    gpio_init(GPIOA, &gpio_initstruct);
    
    gpio_initstruct.gpio_pins = GPIO_PINS_1 | GPIO_PINS_7; // OVC 3 4
    gpio_init(GPIOB, &gpio_initstruct);
}

void vbus_ovc_scan(void)
{
    // if vbus on and ovc
    if(VBUS1_STATRD() && VBUS1_OVCRD())
    {
        VBUS1_OFF();
        hub_state.port_state[0].ovc_state = 1;
    }
    if(VBUS2_STATRD() && VBUS2_OVCRD())
    {
        VBUS2_OFF();
        hub_state.port_state[1].ovc_state = 1;
    }
    if(VBUS3_STATRD() && VBUS3_OVCRD())
    {
        VBUS3_OFF();
        hub_state.port_state[2].ovc_state = 1;
    }
    if(VBUS4_STATRD() && VBUS4_OVCRD())
    {
        VBUS4_OFF();
        hub_state.port_state[3].ovc_state = 1;
    }
}
